/******************************************************************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_PLOT_PANNER_H
#define QWT_PLOT_PANNER_H

#include "qwt_axis_id.h"
#include "qwt_global.h"
#include "qwt_panner.h"
#include "qwt_plot.h"

/*!
   \brief QwtPlotPanner provides panning of a plot canvas

   QwtPlotPanner is a panner for a plot canvas, that
   adjusts the scales of the axes after dropping
   the canvas on its new position.

   Together with QwtPlotZoomer and QwtPlotMagnifier powerful ways
   of navigating on a QwtPlot widget can be implemented easily.

   \note The axes are not updated, while dragging the canvas
   \sa QwtPlotZoomer, QwtPlotMagnifier
 */
class QWT_EXPORT QwtPlotPanner : public QwtPanner {
  Q_OBJECT

public:
  explicit QwtPlotPanner(QWidget *);
  virtual ~QwtPlotPanner() override;

  QWidget *canvas();
  const QWidget *canvas() const;

  QwtPlot *plot();
  const QwtPlot *plot() const;

  void setAxisEnabled(QwtAxisId axisId, bool on);
  bool isAxisEnabled(QwtAxisId) const;

public Q_SLOTS:
  virtual void moveCanvas(int dx, int dy);

protected:
  virtual QBitmap contentsMask() const QWT_OVERRIDE;
  virtual QPixmap grab() const QWT_OVERRIDE;

private:
  class PrivateData;
  PrivateData *m_data;
};

class QWT_EXPORT QwtPlotPannerPlus : public QwtPlotPanner {
  Q_OBJECT
public:
  explicit QwtPlotPannerPlus(QWidget *parent);

  void setMouseButton(Qt::MouseButton, Qt::KeyboardModifiers = Qt::NoModifier);
  void getMouseButton(Qt::MouseButton &button, Qt::KeyboardModifiers &) const;

protected:
  bool eventFilter(QObject *object, QEvent *event) override;

private:
  bool isPressed;
  Qt::MouseButton originalButton = Qt::MouseButton::LeftButton;
  Qt::KeyboardModifiers originalMods = Qt::KeyboardModifier::NoModifier;
};

#endif
